iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0
Mobile Development

Flutter基礎入門系列 第 19

【Day 19】利用path_provider開啟資料夾與檔案

  • 分享至 

  • xImage
  •  

前一篇中提到,sqflite_common_ffi與getDatabase()函式一起使用時不太穩定,可能會有一些bug,建議改使用如path_provider的其他檔案開啟方式。那麼,今天筆者就來介紹一下這是什麼吧!


path_provider簡單介紹

以下為官方文件說明與範例:
package
cookbook

path_provider是用來尋找文件位置的一個package,package中的函式將會回傳一個類別為Directory的物件,而我們後續可在利用該物件來開啟與編寫指定檔案,與獲得資料夾的位置。因為應用程式可能會在不同的裝置與作業系統上運作,文件位置也會隨之改變,使得這個package有著使用上的重要性。不過有一點需要注意,並非所有函式都有支援每個作業系統

以下為開啟的資料夾一覽:

Directory Android iOS Linux macOS Windows
Temporary V V V V V
Downloads V V V V V
Application Support V V V V V
Application Library X V X V X
Application Documents V V V V V
Application Cache V V V V V
External Storage V X X X X
External Cache Directories V X X X X
External Storage Directories V X X X X

至於函式名稱,便是get[Directory]Directory(),中括弧使用欲開啟的資料夾做替換的動作。

來看一下範例會更清楚:

// example 1
Directory tempDir = await getTemporaryDirectory();

// example 2
Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

// example 3
Future<String> _getlocalPath() async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

一定要記得使用await哦!否則程式很可能會在開啟檔案前便直接執行下一行,造成檔案未被成功開啟。

在程式Schedrag中實作

在這個應用程式中,只需要修改data/models/blocks.dart中的BlocksDb.open()便可以了。程式碼如下:

abstract class BlocksDb {
  String dbFilename, tableName, executeSQL;
  bool dbIsOpen = false;
  late var db;

  BlocksDb(
      {required this.dbFilename,
      required this.tableName,
      required this.executeSQL});

  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }

  Future open() async {
    db = await openDatabase(
      join(await _localPath, dbFilename),
      //dbFilename,
      version: 1,
      onOpen: (db) {
        dbIsOpen = true;
      },
      onCreate: (db, version) async {
        await db.execute('''CREATE TABLE $tableName ($executeSQL)''');
      },
    );
    return null;
  }

  ...
}

程式中,新增了get _localPath,來獲取裝置中Documents資料夾的位置,並將它替代openDatabase()中的getDatabase()便能夠成功開啟檔案位置了。

當應用程式執行時,使用該應用程式新增新項目後,能夠看到測試裝置中多了一個名為timeBlock.db的檔案,並且其中的內容確實是剛剛所新增的。
https://ithelp.ithome.com.tw/upload/images/20241003/20169446sr6oDHsJTu.png


謝謝願意閱讀到這裡的讀者!程式碼仍然會一併更新到github: nnyjan02426/Schedrag中。
有任何想說的都歡迎留言或email!
email: nnyjan02426@gmail.com


上一篇
【Day 18】sqflite無法開啟電腦資料庫使用:用sqflite_ffi代替吧!
下一篇
【Day 20】讓程式介面在新增項目時同步更新吧!
系列文
Flutter基礎入門30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言